import * as XLSX from 'xlsx';

/**
 * Excel 解析结果
 */
interface ExcelParseResult<T = any> {
headers: string[];       // 表头数组
data: T[];              // 表格数据（每行一个对象）
sheetName: string;      // 工作表名称
errors?: string[];      // 解析过程中的错误信息
}

/**
 * 解析 Excel 文件
 * @param file Excel 文件（File 或 ArrayBuffer）
 * @param options 配置选项
 * @returns Promise<ExcelParseResult>
 */
export async function parseExcel<T = Record<string, any>>(
file: File | ArrayBuffer,
options?: {
    sheetIndex?: number;          // 指定解析的工作表索引（默认 0）
    headerRowIndex?: number;      // 表头所在行索引（默认 0）
    skipEmptyRows?: boolean;      // 是否跳过空行（默认 true）
}
): Promise<ExcelParseResult<T>> {
try {
    // 1. 读取 Excel 数据
    const workbook = file instanceof File
    ? await readFile(file)
    : XLSX.read(new Uint8Array(file), { type: 'array' });

    // 2. 获取工作表
    const sheetIndex = options?.sheetIndex ?? 0;
    const sheetName = workbook.SheetNames[sheetIndex];
    const worksheet = workbook.Sheets[sheetName];

    if (!worksheet) {
    throw new Error(`工作表 ${sheetIndex} 不存在`);
    }

    // 3. 解析表头
    const headerRowIndex = options?.headerRowIndex ?? 0;
    const headerRange = XLSX.utils.decode_range(worksheet['!ref']!);
    headerRange.s.r = headerRowIndex; // 设置表头行范围
    headerRange.e.r = headerRowIndex;

    const headers: string[] = [];
    for (let col = headerRange.s.c; col <= headerRange.e.c; col++) {
    const cellAddress = XLSX.utils.encode_cell({ r: headerRowIndex, c: col });
    const cell = worksheet[cellAddress];
    headers.push(cell ? String(cell.v) : `Column_${col + 1}`);
    }

    // 4. 解析表格数据
    const jsonData = XLSX.utils.sheet_to_json<T>(worksheet, {
    header: headers,
    range: headerRowIndex + 1, // 跳过表头行
    skipHidden: true,
    defval: null,
    });

    // 5. 过滤空行（可选）
    const data = options?.skipEmptyRows !== false
    ? jsonData.filter(row => Object.values(row).some(val => val != null))
    : jsonData;

    return {
        headers,
        data,
        sheetName,
    };
} catch (error) {
    return {
    headers: [],
    data: [],
    sheetName: '',
    errors: [`解析失败: ${error instanceof Error ? error.message : String(error)}`],
    };
}
}

/**
 * 读取文件为 ArrayBuffer
 */
async function readFile(file: File): Promise<XLSX.WorkBook> {
return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = (e) => {
    try {
        const data = new Uint8Array(e.target?.result as ArrayBuffer);
        resolve(XLSX.read(data, { type: 'array' }));
    } catch (error) {
        reject(error);
    }
    };
    reader.onerror = () => reject(new Error('文件读取失败'));
    reader.readAsArrayBuffer(file);
});
}

/**
 * 导出数据为 Excel 文件
 * @param data 表格数据
 * @param headers 表头（可选）
 * @param fileName 文件名（默认 "export.xlsx"）
 */
export function exportExcel(
    data: Record<string, any>[],
    headers?: string[],
    fileName: string = 'export.xlsx'
): void {
    const worksheet = XLSX.utils.json_to_sheet(data, { header: headers });
    const workbook = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
    XLSX.writeFile(workbook, fileName);
}